Yapei Li

专注于前端领域

0%

js基础3、+、==、&&、||运算符、i++、++i

+的 数学运算和字符拼接

1、当表达式中出现字符串,就是字符串拼接否则是数学运算
2、数学运算:遇到的只要不是字符串都先转化为数字
3、字符串拼接:遇到的只要不是字符串都先调用toString方法转为字符串
4、在对象数据类型的数学运算中除了普通对象,其他的都是先转字符串进行字符串拼接

  • 1+true => 2 数学运算
  • ‘1’ + true => ‘1true’ 字符串拼接
  • [12] + 10 => ‘1210’ 虽然现在没有字符串,但是引用数据类型转为数字先转为了字符串,所以变为了字符串拼接,(在对象数据类型中除了普通对象,其他的都是先转字符串再进行字符串拼接)
  • ({}) + 10 => “[object Object]10”
  • []+ 10 => ‘’ + 10 => ‘10’ 这些输出是控制台直接输出,console.log结果是"[object Object]10"
  • {} +10 => 10 这个和上边说的没关系,因为它既不是数学运算,也不是字符串拼接,他是两部分代码
    • {}代表一个代码块(块级作用域)
    • +10 才是我们的操作
    • 严格写法:{};+10; 结果是10
    • function(){} +10 => +10; => 10
    • +10 就是0+10
1
2
3
4
5
6
7
8
9
10
11
12
13
12+true+false+null+undefined+[]+'哈哈哈'+null+undefined+[]+true

12+true =>13
13+false =>13
13+null =>13
13+undefined =>NaN
NaN+[] => NaN+'' => 'NaN'
'NaN'+'哈哈哈' => 'NaN哈哈哈'
'NaN哈哈哈'+null+undefined => 'NaN哈哈哈nullundefined'
'NaN哈哈哈nullundefined' + [] => 'NaN哈哈哈nullundefined'+''=>'NaN哈哈哈nullundefined'

'NaN哈哈哈nullundefined'+ true => 'NaN哈哈哈nullundefinedtrue'

“==”在进行比较的时候,如果左右两边的数据类型不一样,则先转换为相同的类型(数字类型),再进行比较

对象==对象:不一定相等,对象操作的是引用地址,地址不相同则不相等

1
2
3
4
5
6
7
{name:'aa'}=={name:'aa'}   =>false
[]==[] false

var obj={}
var obj1=obj,obj2=obj;
obj1==obj2 true

不同数据类型比较,都是把其他值转化为数字,然后在进行比较

对象 == 数字 :把对象转化为数字,然后比较

对象==布尔 :把对象转为数字,把布尔也转换为数字

对象==字符串: 把对象转为数字,把字符串也转换为数字

字符串==数字:把字符串转换为数字

字符串==布尔: 都转换为数字

数字==布尔: 布尔转换为数字

null == undefined :true ;js规定null 和 undefined在相等操作符中是相等的(不是转数字的原因)

null除了等于undefined,不等于任何数据

在比较相等性之前,不能将null和undefined转化其他任何数据类型(也就是说null除了等于undefined,不等于任何数据,虽然Number(null) 结果是0 但是 0 == null 是 false)

null === undefined :false

在‘===’情况下null、undefined和其他值都不相等,只和自己相等`

null == null true

undefined == undefined true

NaN== NaN false

NaN和谁都不相等包括自己

1
2
3
4
5
6
7
8
9
10
1==true    :true
1==false :false
2==true :false 这里是把true变为数字


[] == [] :false
[]==false :true 都转化为数字 0 == 0
[]==true :false 都转化为数字 0 == 1
![]==false :true //先算 ![],把数组转化为布尔得到true取反为false => false == false

等号操作

= :赋值,等号左边是变量,右边是值;(右边不管是啥都先转化为值)

==:比较,如果左右两边值的类型不一样,浏览器会默认转化为一样的(转化为数字)在进行比较;例如:’6’ == 6 => ‘6’ ->6 => 6==6 =>true

===:绝对相等,不仅要求值一样,并且类型也要完全一样;’6’===6 false

&&逻辑与 VS ||逻辑或

1、在条件判断中

&&:所有条件都为真,整体才为真

||:只要有一个条件为真,整体都为真

2、在赋值操作中

||: A|| B 首先看A的真假,A为真返回的是A的值,A为假返回的B的值(不管B是啥) 1|| 2 => 1 ;0|| false=>false;

&& : A&& B 首先看A的真假,A为真返回B的值,A为假返回A的值;1&&2 => 2;0&&false => 0

真实项目中我们利用逻辑或实现默认值的设置操作,形参的默认值赋值

callback && callback(); callback为真callback就执行

逻辑与 的优先级高于 逻辑或 先计算 逻辑与

1
2
3
4
5
6
7
8
9
function fn(num,callback){
//=>如果num没有传递值让其默认值为0;
//if(typeof num === 'undefined') num=0; 更严谨
num=num || 0;

//如果 callback传递的是一个函数,就把这个函数执行
//if(typeof callback === 'function') callback(); 更严谨
callback && callback();
}
1
2
3
4
5
0 || 2 && false || 3

2&&false //false
0||false //false
false || 3 //3

数学运算:+、-、*、/、% ,

+不仅仅是数学运算,还有可能是字符串拼接

i++就是单纯的数学运算,已经摒弃掉字符串拼接的规则

数学运算先把不是数字的调用Number()转化为数字

1
2
3
4
5
6
7
8
9
10
11
12
'3' - 1  =>2
Number('3') =>3
3-1 =>2

'3px' - 1 => NaN

'3px' + 1 => '3px1'

var i=3;
i+=i; => '31'
i=i+1; => '31'
i++; =>4 //i++就是单纯的数学运算,已经摒弃掉字符串拼接的规则

i++ 与 ++i